应用机器学习 Advice on Applying Machine Learning

本节包含以下内容:

  1. 诊断学习算法 Diagnostics for debugging learning algorithms
  2. 错误分析 Error analysis

1. 诊断机器学习 Debugging Learning Algorithms

假设要做一个垃圾邮件过滤器,选定了100个单词用作特征,并应用贝叶斯逻辑回归算法,通过梯度下降来求解最优参数。最终在测试集上测试,得到了20%的测试误差。这个误差非常高,接下来要改进这个算法,该如何入手?

贝叶斯逻辑回归算法的优化目标为 $\max_{\theta}\sum_{i=1}^m log p(y^{(i)}|x^{(i)},\theta) - \lambda||\theta||^2$

常见的策略如下:

  • 获取更多的训练样本(高方差问题)
  • 使用更少的特征(高方差问题)
  • 使用更多的特征(高偏差问题)
  • 改变特征:邮件标题 vs 邮件内容(高偏差问题)
  • 让梯度下降迭代更多次(优化算法问题)
  • 使用牛顿法(优化算法问题)
  • 使用不同的 $\lambda$ 值(优化目标问题)
  • 使用SVM算法(优化目标问题)

当然你可以每个策略依次进行十分耗时的尝试,但更好地方法是,优先诊断当前模型面临的问题。

过拟合 vs 欠拟合

观察训练误差和测试误差相对于训练集数量 $m$ 的趋势。

过拟合/高方差:训练误差远小于测试误差。随着样本数 $m$ 的上升,测试误差依然呈现下降趋势。

欠拟合/高偏差:训练误差和测试误差比较接近,但相比于基准都很大。

优化算法问题

例一:贝叶斯逻辑回归对于垃圾邮件有2%的误差,对非垃圾邮件也有2%的误差(对于非垃圾邮件误差过高);线性核SVM对垃圾邮件有10%的误差,对非垃圾邮件有0.1%的误差(可以接受的误差范围)。但出于性能考虑,更希望使用逻辑回归。

例二:使用梯度下降的逻辑回归是否已经收敛?可以绘制目标函数 $J(\theta)$ 相对于迭代次数的折线图。但即使如此,有时也很难确定。可能随着迭代次数,目标函数依然在缓慢变化。

例三:是否使用了正确的目标函数,也许对垃圾邮件和非垃圾邮件的错误率,有不同的容忍度。比如可能希望最大化 $a(\theta)=\sum_i w^{(i)}1\{h_\theta(x^{(i)})=y^{(i)}\}$。设想训练出的结果,$a(\theta_{SVM})>a(\theta_{LR})$,但是由于模型的优化目标依然是 $J$,考虑下面两种情况:

  1. $J(\theta_{SVM})>J(\theta_{LR})$:由于逻辑回归试图最大化 $J$,这表明 $\theta{LR}$ 没能达成优化目标。问题可能是优化算法未收敛。
  2. $J(\theta_{SVM})<J(\theta_{LR})$:SVM在 $J(\theta)$ 上表现更糟,但在 $a(\theta)$ 上表现更好。这说明,我们不应该选用 $J(\theta)$ 作为优化函数。应该变更 $a(\theta)$ 为优化目标。

2. 错误分析 Error analysis

通常机器学习应用包含着由多个组件构成的管道。我们希望知道,每个组件对最终误差的贡献各自有多大。

常见的方法是,按照组件运行的顺序,依次将其替换为使用人工无误差数据的结果,看最终的误差有多大的变化。造成误差提升最高的组件,通常更值得花时间去优化。

另一个常见的需求是分析每个组件对最终准确率的贡献有多大,可以相对应地分别移除每个组件,看最终的准确率会有多大的下降。


In [ ]: